package org.hamcrest.collection;
import static org.hamcrest.core.IsEqual.equalTo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
public class IsArrayContainingInAnyOrder<E> extends TypeSafeMatcher<E[]> {
private final IsIterableContainingInAnyOrder<E> iterableMatcher;
private final Collection<Matcher<? super E>> matchers;
public IsArrayContainingInAnyOrder(Collection<Matcher<? super E>> matchers) {
this.iterableMatcher = new IsIterableContainingInAnyOrder<E>(matchers);
this.matchers = matchers;
}
@Override
public boolean matchesSafely(E[] item) {
return iterableMatcher.matches(Arrays.asList(item));
}
@Override
public void describeMismatchSafely(E[] item, Description mismatchDescription) {
iterableMatcher.describeMismatch(Arrays.asList(item), mismatchDescription);
};
public void describeTo(Description description) {
description.appendList("[", ", ", "]", matchers)
.appendText(" in any order");
}
@Factory
public static <E> Matcher<E[]> arrayContainingInAnyOrder(Matcher<? super E>... matchers) {
return arrayContainingInAnyOrder(Arrays.asList(matchers));
}
@Factory
public static <E> Matcher<E[]> arrayContainingInAnyOrder(Collection<Matcher<? super E>> matchers) {
return new IsArrayContainingInAnyOrder<E>(matchers);
}
@Factory
public static <E> Matcher<E[]> arrayContainingInAnyOrder(E... items) {
List<Matcher<? super E>> matchers = new ArrayList<Matcher<? super E>>();
for (E item : items) {
matchers.add(equalTo(item));
}
return new IsArrayContainingInAnyOrder<E>(matchers);
}
}